use chrono::NaiveDateTime;
use sea_orm::{DeriveEntityModel, DeriveRelation, EnumIter, Related, RelationDef, RelationTrait};

/// 1、定义 User 数据模型, 它包含了所有列的字段，用于存储查询结果的 Rust 结构体
#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel)]
#[sea_orm(table_name = "t_blog")]
pub struct Model {
    #[sea_orm(primary_key)]
    pub menu_id: String,
    pub menu_name: String,
    pub menu_url: String,
    pub menu_icon: String,
    pub menu_type: i32,
    pub parent_id: String,
    pub sort_num: i32,
    #[sea_orm(column_type = "NativeDateTime")]
    pub create_time: Option<NaiveDateTime>,
    #[sea_orm(column_type = "NativeDateTime")]
    pub update_time: Option<NaiveDateTime>,
}

/// 2、Relation（关系）
/// 用户和菜单的关联表，一个用户可以有多个菜单，一个菜单也可以被多个用户拥有。因此，用户和菜单之间属于多对多的关联关系。
/// 参考 sea-orm 官方网站： https://www.sea-ql.org/SeaORM/docs/relation/many-to-many
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
pub enum Relation {}

/// 3、Related（关联）
/// Related 是指在已经获取到一个实体的情况下，通过 Related trait 来获取其关联实体的数据
// SeaORM 中的 Relation 关系是一个箭头：它有 from 和 to 两个方向。user_menu::Relation::User 定义了 UserMenu->User。调用 rev 会将其反转为 User->UserMenu。
impl Related<super::user::Entity> for Entity {
    //
    fn to() -> RelationDef {
        super::user_menu::Relation::User.def()
    }

    // 通过 via 方法，可以指定通过第三张关联表来获取关联实体的数据。
    fn via() -> Option<RelationDef> {
        Some(super::user_menu::Relation::Menu.def().rev())
    }
}